#include "main.h"
#include "app_bootloader.h"
#include "app_wdg.h"
#include "app_usart.h"
/**
 * @brief  错误执行函数
 * @param  无
 * @retval 无
 */
void APP_ErrorHandler(void)
{
	/* 无限循环 */
	while (1)
	{
		printf("Error occurred!\r\n");
		HAL_Delay(1000); // 延时1秒
	}
}
static void APP_SystemClockConfig(void);

/**
 * @brief  应用程序入口函数.
 * @retval int
 */
int main(void)
{
  APP_WDG_Init();

  /* 初始化所有外设，Flash接口，SysTick */
  HAL_Init();

  //  /* 初始化用户按键 */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  GPIO_InitStruct.Pin = GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_SET)
  {
    APP_Bootloader_Go(APP_ADDR);
  
  }
  /* 系统时钟配置 */
  APP_SystemClockConfig();
  /* 初始化USART2外设 */
  APP_USART_Init(USART2);

  APP_Bootloader_Init();
 
  /* 无限循环 */
  while (1)
  {
    APP_Bootloader_ProtocolDetection();
   
  }
}

/**
 * @brief  系统时钟配置函数
 * @param  无
 * @retval 无
 */
static void APP_SystemClockConfig(void)
{
	RCC_OscInitTypeDef OscInitstruct = {0};
	RCC_ClkInitTypeDef ClkInitstruct = {0};

	OscInitstruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE |
								   RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSI48M;
	OscInitstruct.HSEState = RCC_HSE_ON;					 /* 开启HSE */
	OscInitstruct.HSEFreq = RCC_HSE_16_32MHz;				 /* 选择HSE频率4-8M */
	OscInitstruct.HSI48MState = RCC_HSI48M_OFF;				 /* 关闭HSI48M */
	OscInitstruct.HSIState = RCC_HSI_ON;					 /* 开启HSI */
	OscInitstruct.LSEState = RCC_LSE_OFF;					 /* 关闭LSE */
	/* OscInitstruct.LSEDriver       = RCC_LSEDRIVE_HIGH; */ /* 驱动能力等级：高 */
	OscInitstruct.LSIState = RCC_LSI_OFF;					 /* 关闭LSI */
	OscInitstruct.PLL.PLLState = RCC_PLL_ON;				 /* 开启PLL */
	OscInitstruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;		 /* PLL时钟源选择HSE */
	OscInitstruct.PLL.PLLMUL = RCC_PLL_MUL6;				 /* PLL时钟源6倍频 */
	/* 配置振荡器 */
	if (HAL_RCC_OscConfig(&OscInitstruct) != HAL_OK)
	{
		APP_ErrorHandler();
	}

	ClkInitstruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
	ClkInitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; /* 系统时钟选择PLL */
	ClkInitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1;		  /* AHB时钟1分频 */
	ClkInitstruct.APB1CLKDivider = RCC_HCLK_DIV1;		  /* APB1时钟1分频 */
	ClkInitstruct.APB2CLKDivider = RCC_HCLK_DIV2;		  /* APB2时钟2分频 */
	/* 配置时钟 */
	if (HAL_RCC_ClockConfig(&ClkInitstruct, FLASH_LATENCY_5) != HAL_OK)
	{
		APP_ErrorHandler();
	}
	
}


#ifdef USE_FULL_ASSERT
/**
 * @brief  输出产生断言错误的源文件名及行号
 * @param  file：源文件名指针
 * @param  line：发生断言错误的行号
 * @retval 无
 */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* 用户可以根据需要添加自己的打印信息,
     例如: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* 无限循环 */
  while (1)
  {
  }
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT Puya *****END OF FILE******************/
